﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
//int test(int arr[], int sz) {
//    int k = 0;
//    for (int i = 0; i < sz - 1; i++) {
//        for (int j = 0; j < sz - i - 1; j++) {
//            if (arr[j] > arr[j + 1]) {
//                int tmp = arr[j];
//                arr[j] = arr[j + 1];
//                arr[j + 1] = tmp;
//                k++;
//            }
//        }
//    }
//    if (k == (sz * (sz - 1) / 2))//计算上面冒泡排序从大到小排序最坏要排序多少次，如果相等说明该序列为从大到小排序，视为有序序列
//    {
//        k = 0;
//    }
//    return k;
//}
//
//int main() {
//    int n;
//    scanf("%d", &n);
//    int arr[6];
//    for (int i = 0; i < n; i++) {
//        scanf("%d", &arr[i]);
//    }
//    int ret = test(arr, n);
//    if (ret == 0) {
//        printf("sorted");
//    }
//    else {
//        printf("unsorted");
//    }
//    return 0;
//}

//#include <stdio.h>
//int main()
//{
//	int arr[10] = { 0 };
//	int num = 100;
//	char c = 'w';
//	int i = 0;
//	for (i = 0; i < 10; i++)
//	{
//		arr[i] = i;
//	}
//	return 0;
//}



//#include <stdio.h>
////求 1!+2!+3!+4!+...n! 的和
//int main()
//{
//	int n;
//	int sum = 0;
//	scanf("%d", &n);
//	int i = 0;
//	int j = 1;
//	for (i = 1; i <= n; i++)
//	{
//		int ret = 1;
//		for (j = 1; j <= i; j++)
//		{
//			ret *= j;
//		}
//		sum += ret;
//	}
//	printf("%d", sum);
//	return 0;
//}

#include <stdio.h>
//求 1!+2!+3!+4!+...n! 的和
int main()//err
{
	int n;
	int sum = 0;
	scanf("%d", &n);
	int i = 0;
	int j = 1;
	int ret = 1;
	for (i = 1; i <= n; i++)
	{
		for (j = 1; j <= i; j++)
		{
			ret *= j;
		}
		sum += ret;
	}
	printf("%d", sum);
	return 0;
}
